//InstanceType作用 从构造函数 类型 提取实例类型   InstanceType<T>

class Car2{
    id:string
    constructor(id:string){
        this.id = id
    }
}
class Car{
    name: string
    constructor(name: string){
        this.name = name
    }   
    drive(){
        console.log('drive...')
    }
}

type CarInstance = InstanceType<typeof Car>;

let car:CarInstance=new Car('car'); 
// let car:CarInstance=new Car2('car'); 报错 不能将类型“Car2”分配给类型“CarInstance”
console.log(car.name);


//泛型约束 中使用

//{new (...args: any[]): any} 

//定义一个函数，2个参数，第一个是一个可以实例化的类，第二个是这个类的构造函数参数


function getService<T extends {new (...arg:any[]):any}>(className:T,args:any):InstanceType<T>{

    return  new className(args);

}

// let laozi3=getService("abc","劳斯莱斯"); 报错 因为 "abc"不是一个构造函数
 

 let laozi=getService(Car,"劳斯莱斯");

 console.log(laozi.name);

 laozi.drive();
 